/********************************************************************************
 * writer: SDJ
 * create date: 2017-7-15
 * rewriter: vico
 * rewrite date: 2018-1-18
 * description:封装了USER （用户类） LIST（列表类），及表单验证等相关方法
 *
 *********************************************************************************/



 function USER() {
     "use strict"
     //定义常量
     var _USERKEY = 'userInfo'; //默认用户本地缓存变量名
     var _EVENT = 'userEvent'; //默认用户监听事件名称
     var _user = {}; // 内部保存私有用户数据对象
     /*******定义类方法********/

     function _load() { // 读取用户本地缓存数据
         return api.getPrefs({
             key: _USERKEY,
             sync: true
         });
     }

     function _save() { // 保存本地缓存用户数据
         api.setPrefs({
             key: _USERKEY,
             value: JSON.stringify(_user),
         });
     }

     function _clear() { // 清除本地用户缓存数据
         _user = {};
         api.removePrefs({
             key: _USERKEY
         });
     }

     function _init() { // 初始化内部模型对象
         var tUser = _load();
         if (tUser) {
             _user = JSON.parse(tUser);
         } else {
             // 初始化
             _user = {};
         };
     }

     /**
      * 获取用户属性或内部用户对象
      * @param  {String} pPropertyKey 用户属性名
      * @return {[type]}      [description]
      */
     function _get(pPropertyKey, pIsReload) {
         if (pIsReload) {
             _init();
         }
         if ('string' == typeof pPropertyKey) {
             return _user[pPropertyKey];
         } else {
             return _user;
         }
     }
     /**
      * 设置用户属性
      * @param  {Object} pProperty  待保存的用户属性（key-value键值对形式的JSON对象）
      *  当用户属性值改变是，会同步发出用户change事件
      */
     function _set(pProperty) {
         console.log(JSON.stringify(pProperty))
         if ('object' !== typeof pProperty) {
             console.log('【' + api.winName + '】-【' + api.frameName + '】-【User.set()】参数格式错误！【pProperty=' + pProperty + '】');
             return;
         }
         var tIsChanged = false;
         for (var key in pProperty) {
             if (tIsChanged) {
                 _user[key] = pProperty[key];
             } else {
                 var tUserValue = _user[key];
                 var tObjValue = pProperty[key];
                 if (!tUserValue || Object.prototype.toString.call(tUserValue) !== Object.prototype.toString.call(tObjValue)) {
                     _user[key] = tObjValue;
                     tIsChanged = true;
                 } else {
                     if ('object' === typeof tObjValue) { // 对象类型，采用JSON序列化比较
                         if (JSON.stringify(tUserValue) !== JSON.stringify(tObjValue)) {
                             _user[key] = tObjValue;
                             tIsChanged = true;
                         }
                     } else if (tUserValue !== tObjValue) { // 非对象类型，直接比较
                         _user[key] = tObjValue;
                         tIsChanged = true;
                     }
                 }
             }
         }
         if (tIsChanged) { // 内部对象属性改变，更新本地缓存
             _save();
         }
     }
     _init(); // 自动初始化
     // 封装对方接口对象
     var _obj = {
         Clear: function() { //清除本地用户缓存信息
             _clear();
         },
         Init: function() { // 初始化用户内部对象
             _init();
         },
         Set: function(pProperty) { // 设置用户属性并自动更新本地缓存
             _set(pProperty);
         },
         Get: function(pPropertyKey, pIsReload) { // 读取用户属性或用户对象
             return _get(pPropertyKey, pIsReload);
         },
     }
     return _obj;
 }

 /******************************************
                 Date对象扩展方法
 ******************************************/


 /**
  * 闰年判断
  * @param       {Number} pYear 4位数字组成的年份值
  * @constructor
  */
 Date.prototype.isLeapYear = function(pYear) {
         var self = this;
         var tYear = 'number' === typeof pYear ? pYear : self.getFullYear();
         return (tYear % 4 == 0) && (tYear % 100 != 0 || tYear % 400 == 0);
     }
     /**
      * 获取查询月份的天数
      * @param  {Number} pMonth 可选，指定月份，默认当前月份 0-11
      * @param  {Number} pYear  可选，指定年份，默认当前年份，要求完整年格式，如1992
      * @return {Number}        返回月份的日期天数
      */
 Date.prototype.getMonthDays = function(pMonth, pYear) {
         var self = this;
         var tMonth = 'number' === typeof pMonth ? pMonth : (self.getMonth());
         switch (tMonth + 1) {
             case 1:
             case 3:
             case 5:
             case 7:
             case 8:
             case 10:
             case 12:
                 return 31;
                 break;
             case 2:
                 if (self.isLeapYear(pYear)) {
                     return 29;
                 } else {
                     return 28;
                 }
             default:
                 return 30;
         }
     }
     /**
      * 获取指定日期的星期数
      * @param  {Number} pYear  可选，指定年份，默认当前时间年份，要求完整年格式，如1992
      * @param  {Number} pMonth 可选，指定月份，默认当前时间月份 0-11
      * @param  {Number} pDay   可选，指定日期，默认当前时间日期，要求完整年格式，如1992
      * @return {Number}        返回星期数值
      */
 Date.prototype.getWeekNumber = function(pYear, pMonth, pDay) {
     var self = this;
     var tYear = 'number' === typeof pYear ? pYear : self.getFullYear();
     var tMonth = 'number' === typeof pMonth ? pMonth : self.getMonth();
     var tDay = 'number' === typeof pDay ? pDay : self.getDate();
     self.setFullYear(tYear, tMonth, tDay);
     return self.getDay();
 }

 Date.prototype.getDayString = function(prefixStr) {
     var tNum = this.getDay();
     var tPrefixStr = prefixStr ? prefixStr : '星期';
     var tObjStr;
     switch (tNum) {
         case 0:
             tObjStr = '日';
             break;
         case 1:
             tObjStr = '一';
             break;
         case 2:
             tObjStr = '二';
             break;
         case 3:
             tObjStr = '三';
             break;
         case 4:
             tObjStr = '四';
             break;
         case 5:
             tObjStr = '五';
             break;
         case 6:
             tObjStr = '六';
             break;
         default:
             return;
     }
     return tPrefixStr + tObjStr;
 }

 Date.prototype.getString = function(pType, pSymbol) {
     var _self = this;
     var _year = _self.getFullYear();
     var _month = _self.getMonth() + 1;
     if (_month < 10) {
         _month = '0' + _month;
     }
     var _date = _self.getDate();
     if (_date < 10) {
         _date = '0' + _date;
     }
     var _hour = _self.getHours();
     if (_hour < 10) {
         _hour = '0' + _hour;
     }
     var _minute = _self.getMinutes();
     if (_minute < 10) {
         _minute = '0' + _minute;
     }
     var _second = _self.getSeconds();
     if (_second < 10) {
         _second = '0' + _second;
     }
     var tSymbol = 'string' === typeof pSymbol ? pSymbol : '-';
     var tDateStr = _year + tSymbol + _month + tSymbol + _date;
     var tTimeStr = _hour + ":" + _minute + ":" + _second;
     if ('date' == pType) {
         return tDateStr;
     } else if ('time' == pType) {
         return tTimeStr;
     } else {
         return tDateStr + ' ' + tTimeStr;
     }
 }
 /**
  * 时间戳转换年月日
  * @param  {Number} pStamp 必填，要转换时间格式的事件戳，当前时间可传''
  * @param  {Number} pSign  可选，hours：YYYY-MM-DD HH:MM  mins: YYYY-MM-DD HH:MM:SS   month: MM-DD     sec :  YYYY-MM-DD HH:MM:SS    default: YYYY-MM-DD
  */
 //时间戳转日期格式
 function fnStampToDate(pStamp, pSign) {
   var tCurrentTime;
   if(pStamp){
      tCurrentTime = new Date(pStamp);
   }else{
      tCurrentTime = new Date();
   }
   var tYear = tCurrentTime.getFullYear();
   var tMonth = fix(tCurrentTime.getMonth() + 1, 2);
   var tDate = fix(tCurrentTime.getDate(), 2);
   var tHours = fix(tCurrentTime.getHours(), 2);
   var tMinutes = fix(tCurrentTime.getMinutes(), 2);
   var tSeconds = fix(tCurrentTime.getSeconds(), 2);
   if (pSign == 'hours') {
     return tYear + '-' + tMonth + '-' + tDate + ' ' + tHours + ':' + tMinutes;
   }
   if (pSign == 'mins') {
     return tYear + '-' + tMonth + '-' + tDate + ' ' + tHours + ':' + tMinutes + ':00';
   }
   if (pSign == 'month') {
     return tMonth + '-' + tDate;
   }
   if (pSign == 'sec') {

     return tYear + '-' + tMonth + '-' + tDate + ' ' + tHours + ':' + tMinutes + ':' + tSeconds;
   }
   return tYear + '-' + tMonth + '-' + tDate
 }
 //日期加0
 function fix(num, length) {
     return ('' + num).length < length ? ((new Array(length + 1)).join('0') + num).slice(-length) : '' + num;
 }
